package JavaSE;
import java.util.Scanner;
import java.util.ArrayList;

public class time_20250412数据类型练习 {
    public static void main(String[] args) {
    /*
    1.基本数据类型题
    (1) 声明一个整型变量并赋值为100，然后输出该变量的值。
    (2) 声明一个浮点型变量并赋值为3.14，然后输出该变量的值。
    (3) 声明一个double型的数据并给其赋值输出
    (4) 声明一个字符型变量并赋值为’A’，然后输出该变量的值。
    */
        System.out.println("(1) 声明一个整型变量并赋值为100，然后输出该变量的值。");
        int num1 = 100;
        System.out.println(num1);
        System.out.println();

        System.out.println("(2) 声明一个浮点型变量并赋值为3.14，然后输出该变量的值。");
        //float num2 = 3.14;
        float num2 = 3.14f;
        //或者
        //float num2 = 3.14F;
        /*如果您在Java代码中写 float num2 = 3.14;
        而不加上 ‘f’ 或 ‘F’ 后缀，编译器会默认 3.14 是一个 double 类型的字面量，
        因为Java中默认的浮点数类型是 double。
        由于 double 类型的精度比 float 类型高，
        且 double 类型的字面量不能直接赋值给 float 类型的变量，
        编译器会报错。*/
        System.out.println(num2);
        System.out.println();

        System.out.println("(3)声明一个double型的数据并给其赋值输出");
        double num3 = 3.141592653;
        System.out.println(num3);
        System.out.println();

        System.out.println("(4) 声明一个字符型变量并赋值为’A’，然后输出该变量的值。");
        /*String str = 'A';
        错误写法，'A'是字符，不是字符串，
        String类型的变量是字符串类型变量，用双引号括起来的，
        单引号括起来的是字符型变量，应该定义为cahr类型，并且只能有一个字符*/

        /*基础不牢，地动山摇，
        就你现在这样，还想去找实习，真的是可笑，你不好好学呢嘛，
        到时候有得你哭的
        (好了，现在自己对自己也像我爸跟我说的了，但是事实确实是这样，肚子里没点东西，出来真的很丢人，
        坐在蓝桥杯考场上连输入都忘记怎么写了，真的想找个地洞钻进去)*/
        char str1 = 'A';
        String str2 = "A";

        System.out.println("字符类型变量："+str1);
        System.out.println("字符串类型变量："+str2);
        System.out.println();


        //扩展：字符串拼接
        System.out.println("扩展：字符串拼接");
        System.out.println("两个字符串的拼接");
        //两个字符串的拼接
        String str_test1 = "Hello,";
        String str_test2 = "World!";
        //使用+运算符拼接两个字符串
        String result1 = str_test1 + str_test2;
        System.out.println("两个字符串拼接后的结果:"+result1);
        System.out.println();

        System.out.println("多个字符串进行拼接");
        //多个字符串进行拼接
        System.out.println("法一：直接用+运算符进行拼接即可");
        //法一：直接用+运算符进行拼接即可
        String str_test3 = "I ";
        String str_test4 = "have ";
        String str_test5 = "an ";
        String str_test6 = "apple^_^";
        String result2 = str_test3+str_test4+str_test5+str_test6;
        System.out.println(result2);
        System.out.println();

        System.out.println("法二:使用StringBuilder类拼接字符串");
        //法二:使用StringBuilder类拼接字符串
        String str_test7 = "hahahaha ";
        String str_test8 = "I'm ";
        String str_test9 = "so ";
        String str_test10 = "happy~~~~";
        StringBuilder result = new StringBuilder();
        result.append(str_test7);
        result.append(str_test8);
        result.append(str_test10);

        //关于拼接好的字符串的输出：

        /*法一
        //将StringBuilder转换为String
        String result3 = result.toString();
        System.out.println(result3);
        */

        //法二：也可以直接输出拼接好的字符串时可以直接输出StringBuilder对象result
        System.out.println(result);
        System.out.println();
       /*注意：
       StringBuilder 本身不能直接输出，
       但是你可以通过 System.out.println(sb); 来输出其内容，
       因为 StringBuilder 的 toString() 方法在打印时会被自动调用。
       然而，如果你需要将拼接好的字符串传递给一个方法或者存储在某个需要 String 类型的地方，
       你就需要显式地调用 toString() 方法来进行转换。
       即没有直接使用System.out.println()来输出StringBuilder对象的时候都需要将StringBuilder对象转换成String类型的数据才能将拼接好的字符串作为String类型的数据进行操作
       String类型的数据和StringBuilder类型的数据是两种不一样类型的数据
       而System.out.println()的主要任务是打印字符串到控制台，它能打印基本数据类型和对象，但是在打印对象的时候会调用toString方法先将对象转化为字符串，然后再进行输出
       在遇到非基本数据类型的时候直接打印这个非基本数据类型时，
       println()方法会在它的源码内部调用自己重写的Object类中的toString()方法，
       将该非基本数据类型转换成字符串基本数据类型(String类型)
       而我们在没有使用System.out.println()进行操作StringBuilder对象的时候，也就是说像直接把拼接好的字符串(即StringBuilder对象)作为String类型的数据进行操作的时候会报错，这种操作是不可行的
       */

        //示例："如果你需要将拼接好的字符串传递给一个方法或者存储在某个需要 String 类型的地方，你就需要显式地调用 toString() 方法来进行转换。"
       StringBuilder sb = new StringBuilder();
       sb.append("我");
       sb.append("是");
       sb.append("傻逼");
       sb.append("，也是菜鸟，笨蛋，菜死了!!!!!!!");
       String result_toString = sb.toString();
        //需要将拼接好的字符串作为String类型的参数传递给一个方法，则拼接好的字符串需要使用toString方法显示转换为String类型的数据
        System.out.println("======将拼接好的数据作为String类型的数据的参数传递给方法======");
        printString(result_toString);
        System.out.println();
       /*
       在Java中，StringBuilder类用于高效地拼接字符串，
       但是它并不是String类型。
       当您需要将拼接好的字符串存储在某个只接受String类型的地方时，
       比如一个String数组、一个方法的参数或者一个类的属性，
       您就需要将StringBuilder对象显式地转换为String类型。
       */
       String[] stringArray = new String[1];
       stringArray[0] = result_toString;
        System.out.println("======将拼接好的数据作为String类型的数据存到String类型的数组中======");
        System.out.println(stringArray[0]);
        System.out.println();


        //使用for循环实现多个字符串的拼接
        System.out.println("=====使用for循环实现多个字符串的拼接====");
        /*
        在Java中，数组的大小在创建时就必须确定，而且一旦确定就不能更改。
        如果您想要一个可以动态调整大小的“数组”，您可以使用ArrayList，
        它是一个可以动态增长和缩减的数组-like数据结构。
        */


        //1.第一种：多个字符串用数组存储---静态存储，字符串的个数从一开始就要确定好
        Scanner scanner = new Scanner(System.in);
        String[] strings = new String[5];//设置字符串的个数为5

        for(int i = 0;i < strings.length;i++){
            System.out.println("请输入字符串数组中的第"+(i+1)+"个元素:");
            strings[i] = scanner.nextLine();
        }

        //使用StringBuilder来高效拼接字符串
        StringBuilder result_strings1 = new StringBuilder();

        //使用for循环遍历字符串数组并拼接
        for(String str : strings){
            result_strings1.append(str);
        }

        System.out.println("拼接后的字符串为:"+result_strings1.toString());


        //2.第二种：多个字符串用ArrayList(顺序表)来存储---动态存储，字符串的个数可以手动输入
        //使用ArrayList来存储字符串，这样可以动态添加元素
        ArrayList<String> stringList = new ArrayList<>();

        //让用户可以手动无限输入，如果不想再输入了就输入done然后回车结束输入
        System.out.println("请输入字符串数组中的元素(输入done结束输入):");
        while(true){
            String input = scanner.nextLine();
            if("done".equalsIgnoreCase(input)){//检查用户输入的字符串是否等于"done"，不区分大小写。如果用户输入的是"done"、“Done”、"DONE"等，equalsIgnoreCase方法会返回true，然后执行break语句，跳出无限循环。
                break;
            }
            stringList.add(input);//如果用户输入的字符串不是"done"，那么这行代码会将用户输入的字符串添加到stringList中，这是一个ArrayList<String>类型的变量，用于存储用户输入的字符串。
        }

        //使用StringBuilder来高效拼接字符串
        StringBuilder result_strings2 = new StringBuilder();

        //使用for循环遍历ArrayList并拼接
        for(String str : stringList){
            result_strings2.append(str);
        }

        System.out.println("拼接后的字符串为:"+result_strings2.toString());

        scanner.close();


        //字符的拼接
        System.out.println("======字符的拼接=====");
        char char1 = 'A';
        char char2 = 'B';
        /*
        char1 和 char2 都是 char 类型。
        在Java中，char 类型相加实际上是进行数值相加，
        而不是字符串拼接。结果是 int 类型，
        因为 char 类型在数值运算时会提升为 int。
        因此，你不能直接将结果赋值给 String 类型的变量。
        所以String char_result = char1+char2;是会报错的，并且会说数据类型不对，IDEA会提示说char1+char2是int类型的，不能赋值给String类型的变量
        另外：
        ‘A’ 的 ASCII 码值是 65，‘B’ 的 ASCII 码值是 66。
        int char_result = (char1+char2);
        System.out.println(char_result);//这两句代码是对的


        String char_result = (String)(char1+char2);直接强转也是错的
        char1 + char2 的结果是 int 类型，因为 char 类型在数值运算时会提升为 int。
        你不能直接将 int 类型强制转换为 String 类型。
        在Java中，基本数据类型（如 int）和引用数据类型（如 String）之间的转换需要使用特定的方法，如 String.valueOf(int)。
        正确的转换方式是先使用 String.valueOf() 方法将 int 转换为 String，然后再进行赋值。
        */

        /*将字符拼接后正确的转换方法
        (1)String char_result = ""+char1+char2;
        (2)使用String.valueOf()
        */
        /*String char_result1 = ""+char1+char2的原理
        "" 是一个空字符串，它是一个String类型的对象。
        char1 和 char2 是char类型的变量，分别包含字符’A’和’B’。
        当你使用 "" + char1 时，Java会自动将char类型的char1转换为String类型，并与空字符串连接，结果是一个包含字符’A’的字符串。
        接着，"" + char1 + char2 会将上一步得到的字符串与char2连接。同样，char2会被自动转换为String类型，并拼接到前面的字符串上。
        最终，char_result1 会是一个包含字符’A’和’B’的字符串，即"AB"。*/
        String char_result1 = ""+char1+char2;
        System.out.println("使用String char_result1 = \"\"+char1+char2将char1和char2拼接起来："+char_result1);
        System.out.println();

        //String char_result2 = String.valueOf(char1+char2);注意这句代码是错误的，它是将char1+char2相加之后的整型结果131转换成了字符串类型的131，输出的还是131(只不过此时的131是String类型的)
        String char_result2 = String.valueOf(char1)+String.valueOf(char2);//先将char1和char2分别转换成String类型的数据，然后再把两个String类型的数据使用+进行拼接
        System.out.println("使用String.valueOf()即String char_result2 = String.valueOf(char1)+String.valueOf(char2)将char1和char2拼接起来："+char_result2);
        System.out.println();
    }
    public static void printString(String str){
        System.out.println(str);
    }
}
